using Godot;
using System;

/// <summary>
/// Flappy Bird 相机控制器
/// 实现水平方向的平滑跟随，可配置边界和跟随参数
/// </summary>
public partial class FlappyCamera : Camera2D
{
    [Export]
    private Node2D _target; // 相机要跟随的目标节点
    
    [Export]
    private float _followSpeed = 15; // 跟随速度因子，值越大响应越快
    
    [Export]
    private float _verticalOffset = 0; // 垂直方向的固定偏移量
    
    [Export]
    private float _minX = -10000; // 相机左边界限制
    
    [Export]
    private float _maxX = 10000; // 相机右边界限制
    
    [Export]
    private bool _smoothingEnabled = true; // 是否启用平滑跟随效果

    /// <summary>
    /// 在物理帧更新相机位置
    /// </summary>
    /// <param name="delta">时间增量</param>
    public override void _PhysicsProcess(double delta)
    {
        base._PhysicsProcess(delta);
        
        // 安全检查，确保目标节点存在
        if (_target == null || !IsInstanceValid(_target))
            return;
        
        // 计算目标水平位置，限制在边界内
        float targetX = Mathf.Clamp(_target.Position.X, _minX, _maxX);
        float currentX = Position.X;
        
        float newX;
        
        if (_smoothingEnabled)
        {
            // 使用Lerp实现平滑过渡，避免使用昂贵的向量运算
            // Lerp公式: start + (end - start) * weight
            newX = Mathf.Lerp(currentX, targetX, (float)delta * _followSpeed);
        }
        else
        {
            // 直接跟随，无平滑效果
            newX = targetX;
        }
        
        // 更新相机位置，应用垂直偏移
        Position = new Vector2(newX, Position.Y + _verticalOffset);
    }

    /// <summary>
    /// 节点就绪时初始化相机位置
    /// </summary>
    public override void _Ready()
    {
        base._Ready();
        // 初始化相机位置，使其与目标位置一致
        if (_target != null && IsInstanceValid(_target))
        {
            Position = new Vector2(_target.Position.X, Position.Y + _verticalOffset);
        }
    }

    /// <summary>
    /// 设置相机跟随的目标节点
    /// </summary>
    /// <param name="target">新的目标节点</param>
    public void SetTarget(Node2D target)
    {
        _target = target;
        // 立即更新位置以避免延迟
        if (IsInstanceValid(target))
        {
            Position = new Vector2(target.Position.X, Position.Y + _verticalOffset);
        }
    }
    
    /// <summary>
    /// 设置相机的垂直偏移量
    /// </summary>
    /// <param name="offset">新的垂直偏移值</param>
    public void SetVerticalOffset(float offset)
    {
        // 计算偏移差值
        float offsetDelta = offset - _verticalOffset;
        _verticalOffset = offset;
        
        // 立即应用偏移差值，而不是重新设置整个偏移
        Position = new Vector2(Position.X, Position.Y + offsetDelta);
    }
}